/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polybook.model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import polybook.utils.Log;
import polybook.utils.ProcessCallBackable;
import polybook.utils.SortUtils;

/**
 * Cette classe est le réseau, elle regroupe un ensemble de personnes ainsi que
 * les liens qui les unies.
 */
public abstract class Network {

    /* Collection représentant l'ensemble des personnes sur le réseau. */
    protected ArrayList<Person> container;
    /* Entier correspondant au nombre total de liens d'amitiés présent sur le réseau. */
    protected int nbLink = 0;
    /* Valeur initiale de la probabilité comparée au nombre aléatoire lors de l'initialisation. */
    protected static final float INIT_PROBA = 0.4f;
    /* Objet de connexion entre l'interface graphique et le reste du systeme (evite le multi thread) */
    protected ProcessCallBackable callbacker;
    
    /**
     * Cette méthode ajoute un nombre de personnes passé en paramètre au réseau 
     * existant. Le réseau est complété et les liens d'amitiés ajoutés en
     * fonction de la probabilité de chaque personne du réseau.
     * 
     * @param addNb - Nombre de personne à ajouter au réseau.
     */
    public abstract void addPersonAtNetwork(int addNb) throws IOException, IllegalAccessException;

    /**
     * Cette méthode test la personne passée en paramètres avec toutes les
     * personnes du réseau. Elle crée des liens d'amitiés selon le pourcentage
     * calculé.
     * 
     * @param Person La personne que l'on va comparer à tout le réseau.
     * @param Boolean Indiquant si l'on se trouve dans l'initialisation ou non.
     */
    protected abstract void addLink(Person onePerson1);

    /**
     * Supprime les différents liens existants entre la personne passée en paramètres 
     * et les autres membres du réseaux.
     * 
     * @param String Le pseudo de la personne à détacher du réseaux
     */
    public abstract void deleteLink(Person personToDelete) throws IllegalArgumentException;

    /**
     * @return Nombre de lien du reseau
     */
    public abstract int getNbLink();

    @Override
    public String toString() {
        
        for (Person onePerson : this.container) {
            Log.v("La personne " + onePerson.nomPerson + " a " + onePerson.friendListPerson.size());
        }
        return "Network{" + "size=" + container.size() + '}';
    }
    
    /**
     * Permet de définir le container du réseau.
     * @param personsMap Nouveau container
     */
    public void setContainer(ArrayList<Person> personsMap) {
        this.container = personsMap;
    }
    
    /**
     * @return Retourne le container du reseau
     */
    public ArrayList<Person> getContainer() {
        return container;
    }
    
    /**
     * Trie le réseau par Nom/prénom
     */
    public void SortByName() {
        Collections.sort(this.container, SortUtils.compParNomPrenom);
    }

    /**
     * Trie le réseau par nombre d'amis
     */
    public void SortByFriend() {
        Collections.sort(this.container, SortUtils.compParDegre);
    }

    public int size() {
        return container.size();
    }
    
    public void setCallbacker(ProcessCallBackable callbacker) {
        this.callbacker = callbacker;
    }

    public ProcessCallBackable getCallbacker() {
        return callbacker;
    }
}
